home *** CD-ROM | disk | FTP | other *** search
- /************************************************************************
- * *
- * BackGrounder.C *
- * *
- * Written by Casper Boon, April, 1992. *
- * *
- * © 1992, CorkScrew Computer Technologies. *
- * *
- ************************************************************************/
-
- #include "BackGrounder.H"
-
- typedef struct _BackGroundTask
- {
- struct _BackGroundTask *qLink;
- integer *flag;
- CallBackProcPtr callBack;
- Ptr param;
- LongInt timeout;
- } BackGroundTask, *BGTaskPtr;
-
- typedef struct
- {
- BGTaskPtr qHead;
- BGTaskPtr qTail;
- } BQHdr, *BQHPtr;
-
- static BQHdr bgQueue = { NIL, NIL };
- static integer FindFree(void);
-
- void AddQueue(BGTaskPtr task, BQHPtr q);
- void DelQueue(BGTaskPtr task, BQHPtr q);
-
- /************************************************************************
- * *
- * *
- ************************************************************************/
- void AddQueue(BGTaskPtr task, BQHPtr q)
- {
- task->qLink = NIL;
-
- if (q->qHead == NIL) q->qHead = q->qTail = task;
- else
- {
- (q->qTail)->qLink = task;
- q->qTail = task;
- }
- }
-
- /************************************************************************
- * *
- * *
- ************************************************************************/
- void DelQueue(BGTaskPtr task, BQHPtr q)
- {
- register BGTaskPtr tmp;
-
- /* the easy case first, the item is the first in the queue */
- if ( (tmp = q->qHead) == task)
- {
- q->qHead = tmp->qLink;
- if (q->qTail == task)
- q->qTail = NIL;
- }
- else
- {
- /* look for the item in the queue before the one we are removing */
- while (tmp && tmp->qLink && tmp->qLink != task)
- tmp = tmp->qLink;
-
- if (tmp->qLink && tmp->qLink == task)
- {
- tmp->qLink = task->qLink;
- if (q->qTail == task)
- q->qTail = tmp;
- }
- }
- }
-
-
- /************************************************************************
- * *
- * *
- ************************************************************************/
- Ptr Background(integer *flag, CallBackProcPtr proc, Ptr param)
- {
- return Timeout(flag, proc, param, -1L);
- }
-
- /************************************************************************
- * *
- * *
- ************************************************************************/
- Ptr Timeout(integer *flag, CallBackProcPtr proc,
- Ptr param, LongInt timeout)
- {
- BGTaskPtr task;
-
- RunBackground();
-
- task = (BGTaskPtr)NewPtr(sizeof(BackGroundTask));
-
- task->qLink = NIL;
- task->flag = flag;
- task->callBack = proc;
- task->param = param;
- if (timeout != -1)
- task->timeout = timeout + Ticks;
- else
- task->timeout = -1;
-
- AddQueue(task, &bgQueue);
- return (Ptr)task;
- }
-
- /************************************************************************
- * *
- * *
- ************************************************************************/
- void KillBackground(Ptr ident)
- {
- BGTaskPtr task = (BGTaskPtr)ident;
-
- DelQueue(task, &bgQueue);
- DisposPtr((Ptr)task);
- }
-
-
- /************************************************************************
- * *
- * *
- ************************************************************************/
- void RunBackground()
- {
- BGTaskPtr task, end;
- Boolean first = TRUE;
- CallBackProcPtr proc;
-
- do {
- if ( first )
- {
- task = (BGTaskPtr)bgQueue.qHead,
- end = (BGTaskPtr)bgQueue.qTail;
- }
- else
- task = (BGTaskPtr)task->qLink;
-
- if ( !task ) break;
-
- first = FALSE;
-
- if ( (*(task->flag) <= 0) || /* task has completed */
- ( (task->timeout > 0) && /* has a timeout value */
- (task->timeout <= Ticks) ) ) /* and has timed out */
- {
- proc = task->callBack;
- DelQueue(task, &bgQueue);
- (*proc)(*(task->flag), task->param);
- DisposPtr((Ptr)task);
- first = TRUE;
- }
- }
- while ( task != end );
- }
-